/*
 * %W% %E%
 *
 * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */

package com.sun.corba.se.spi.orb ;

import com.sun.corba.se.spi.orb.ORBVersion ;
import com.sun.corba.se.impl.orb.ORBVersionImpl ;
import org.omg.CORBA.portable.InputStream ;
import org.omg.CORBA.INTERNAL ;

public class ORBVersionFactory {
    private ORBVersionFactory() {} ;

    public static ORBVersion getFOREIGN() 
    {
	return ORBVersionImpl.FOREIGN ;
    }

    public static ORBVersion getOLD() 
    {
	return ORBVersionImpl.OLD ;
    }

    public static ORBVersion getNEW() 
    {
	return ORBVersionImpl.NEW ;
    }

    public static ORBVersion getJDK1_3_1_01() 
    {
	return ORBVersionImpl.JDK1_3_1_01 ;
    }

    public static ORBVersion getNEWER() 
    {
	return ORBVersionImpl.NEWER ;
    }

    public static ORBVersion getPEORB() 
    {
	return ORBVersionImpl.PEORB ;
    }

    /** Return the current version of this ORB
     */
    public static ORBVersion getORBVersion()
    {
	return ORBVersionImpl.PEORB ;
    }

    public static ORBVersion create( InputStream is ) 
    {
	byte value = is.read_octet() ;
	return byteToVersion( value ) ;
    }

    private static ORBVersion byteToVersion( byte value ) 
    {
	/* Throwing an exception here would cause this version to be 
	* incompatible with future versions of the ORB, to the point 
	* that this version could
	* not even unmarshal objrefs from a newer version that uses 
	* extended versioning.  Therefore, we will simply treat all 
	* unknown versions as the latest version.
	if (value < 0)
	    throw new INTERNAL() ;
	*/

	/**
	 * Update: If we treat all unknown versions as the latest version
	 * then when we send an IOR with a PEORB version to an ORB that
	 * doesn't know the PEORB version it will treat it as whatever
	 * its idea of the latest version is.  Then, if that IOR is
	 * sent back to the server and compared with the original
	 * the equality check will fail because the versions will be
	 * different.
	 *
	 * Instead, just capture the version bytes.
	 */

	switch (value) {
	    case ORBVersion.FOREIGN : return ORBVersionImpl.FOREIGN ;
	    case ORBVersion.OLD : return ORBVersionImpl.OLD ;
	    case ORBVersion.NEW : return ORBVersionImpl.NEW ;
            case ORBVersion.JDK1_3_1_01: return ORBVersionImpl.JDK1_3_1_01 ;
	    case ORBVersion.NEWER : return ORBVersionImpl.NEWER ;
	    case ORBVersion.PEORB : return ORBVersionImpl.PEORB ;
	    default : return new ORBVersionImpl(value); 
	}
    }
}
